page.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { notFound } from 'next/navigation';
  2. import { allPages } from 'contentlayer/generated';
  3. import { Metadata } from 'next';
  4. import Mdx from '@/components/MDX';
  5. interface PageProps {
  6. params: {
  7. slug: string
  8. }
  9. }
  10. export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
  11. const page = await getPageFromParams(params);
  12. if (!page) {
  13. return {};
  14. }
  15. return {
  16. title: `${page.title}`,
  17. description: page.description,
  18. robots: page.robots,
  19. };
  20. }
  21. async function getPageFromParams(params) {
  22. const slug = params?.slug,
  23. page = allPages.find((page) => page.slugAsParams === slug);
  24. if (!page) {
  25. null;
  26. }
  27. return page;
  28. }
  29. export async function generateStaticParams(): Promise<PageProps['params'][]> {
  30. return allPages.map((page) => ({
  31. slug: page.slugAsParams,
  32. }));
  33. }
  34. export default async function PagePage({ params }: PageProps) {
  35. const page = await getPageFromParams(params);
  36. if (!page) {
  37. notFound();
  38. }
  39. return (
  40. <>
  41. {page && page.title && (
  42. <>
  43. <div className="section-header">
  44. <h1 className="section-title section-title-lg">{page.title}</h1>
  45. </div>
  46. </>
  47. )}
  48. <div className="markdown">
  49. {page.description && <p className="lead">{page.description}</p>}
  50. <Mdx code={page.body.code} />
  51. </div>
  52. </>
  53. );
  54. }